package top.cardone.context.util;

import org.apache.commons.lang3.ArrayUtils;
import org.springframework.util.StringUtils;
import top.cardone.context.ApplicationContextHolder;
import top.cardone.context.i18n.LocaleContextHolder;
import top.cardone.core.util.func.Func1;

import java.util.Locale;

/**
 * 消息工具类
 *
 * @author yao hai tao
 */
public class MessageUtils {
	private MessageUtils() {
	}

	/**
	 * 获取消息
	 *
	 * @param code           代码
	 * @param defaultMessage 默认消息
	 * @return 消息
	 */
	public static String getMessage(String code, String defaultMessage) {
		return getMessage(code, null, defaultMessage);
	}

	/**
	 * 获取消息
	 *
	 * @param code           代码
	 * @param args           参数
	 * @param defaultMessage 默认消息
	 * @return 消息
	 */
	public static String getMessage(String code, Object[] args, String defaultMessage) {
		if (ApplicationContextHolder.getApplicationContext() == null) {
			return null;
		}

		return getMessage(code, args, defaultMessage, LocaleContextHolder.getLocale());
	}

	/**
	 * 获取消息
	 *
	 * @param code           代码
	 * @param args           参数
	 * @param defaultMessage 默认消息
	 * @param locale         时区
	 * @return 消息
	 */
	public static String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
		if (ApplicationContextHolder.getApplicationContext() == null) {
			return null;
		}

		if (org.apache.commons.lang3.StringUtils.isBlank(defaultMessage)) {
			if (ArrayUtils.isEmpty(args)) {
				defaultMessage = code;
			} else {
				defaultMessage = org.apache.commons.lang3.StringUtils.join(args);
			}
		}

		return ApplicationContextHolder.getApplicationContext().getMessage(code, args, defaultMessage, locale);
	}

	/**
	 * @param code                     代码
	 * @param args                     参数
	 * @param defaultString            默认字符
	 * @param readOneMessageFuncBeanId 读取方法beanId
	 * @return 字符串
	 */
	public static String getMessage(String code, Object[] args, String defaultString, String readOneMessageFuncBeanId) {
		String message = ApplicationContextHolder.func(Func1.class, func -> (String) func.func(code), readOneMessageFuncBeanId);

		return getMessage(message, code, args, defaultString);
	}

	/**
	 * 转换为消息
	 *
	 * @param message        消息
	 * @param code           代码
	 * @param args           参数
	 * @param defaultMessage 默认消息
	 * @return 消息
	 */
	public static String getMessage(String message, String code, Object[] args, String defaultMessage) {
		Locale locale = LocaleContextHolder.getLocale();

		if (!StringUtils.isEmpty(message)) {
			return MessageFormatUtils.getMessageFormat(message, locale).format(args);
		}

		return getMessage(code, args, defaultMessage, locale);
	}
}